<p>После разработки собственного компонента рекомендуется проводить оптимизацию его кода на объемах тестовых данных, приближенных к реальным. Это не только улучшит текущую производительность веб-проекта, но и сдержит ухудшение характеристик производительности при увеличении объема информации в веб-проекте, а также сделает систему более устойчивой.</p>

<p>Оптимизацию по расходу компонентом оперативной памяти удобно проводить с помощью PHP функций "memory_get_usage" и "memory_get_peak_usage". Важно определить максимальный объем оперативной памяти, которую может использовать компонент.</p>

<p>Допустим, если веб-проекту выделен максимальный объем памяти в 64МБ, то, очевидно, ни один компонент не должен расходовать больший объем памяти - иначе выполнение веб-страницы завершиться ошибкой и посетителю отобразится белый экран в лучшем случае, а в худшем - из-за ошибки завершится важный бизнес-процесс и, возможно, потеряется часть данных.</p>

<p>Распространены следующие ошибки, связанные с перерасходом памяти и процессорных мощностей:</p>

<ul>
<li>Компонент сохраняет результаты запросов к базе данных (через API Bitrix Framework) в массивах PHP. При увеличении объема информации в базе данных размер массивов компонента может превысить выделенный веб-проекту объем оперативной памяти.

Рекомендуется оптимизировать объем сохраняемой компонентом в оперативной памяти информации, например, используя временные таблицы базы данных, файлы,  изменив характер запроса и т.п. - важно гарантировать, что при работе компонента не будет использовано более, например, 8МБ памяти вне зависимости от объема обрабатываемых компонентом данных.</li>

<li>Компонент пытается объединить результаты запросов к API Bitrix Framework - сначала добавляя их в массивы, затем обрабатывая их в оперативной памяти. Фактически, компонент пытается средствами языка программирования "выполнить работу" базы данных по объединению информации (JOIN). Иногда данную задачу решают для соединения информации из нескольких информационных блоков.

Рекомендуется использовать встроенные возможности информационных блоков по объединению (JOIN) выборок. Для достижения максимальной гибкости можно создать свои таблицы в базе данных, работать с ними через API  Bitrix Framework и использовать встроенные средства БД по объединению данных.</li>

<li>Компонент помещает в оперативную память для обработки файлы целиком. Разумеется, если файл окажется большим - работа компонента будет прекращена по ошибке. Рекомендуется обрабатывать  большие файлы - по частям. Важно гарантировать, что при работе компонента не будет использовано более, например, 8МБ памяти вне зависимости от размера файла.</li>

<li>Компонент выполняет интенсивные вычисления, нагружая процессоры и замедляя построение веб-страницы.

Рекомендуется либо выполнять вычисления в фоновом, асинхронном режиме и отдавать пользователям результат вычислений , либо использовать кеширование.</li>
 </ul>

<p>К сожалению, иногда данные проблемы решаются путем выделения веб-проекту огромных размеров оперативной памяти - 512МБ и больше. Что, естественно, не только ухудшает стабильность и производительность веб-проекта, но и приводит к неэффективному использованию аппаратных возможностей сервера.</p>

<p>Рекомендуется, наоборот, уменьшать размер выделенной веб-проекту оперативной памяти до нахождения оптимального размера (рекомендованный размер оперативной памяти для платформы Bitrix Framework - не менее 64МБ).</p>



<ol>
<li>Необходимо убедиться, что при разработке собственных компонентов веб-проекта выполнены вышеперечисленные рекомендации.</li>

<li>Необходимо совместно с системным администратором веб-проекта после проведения нагрузочного тестирования либо определенного периода эксплуатации (например, каждую неделю) - посмотреть лог ошибок PHP или веб-сервера на предмет наличия сообщений об ошибках, связанных с нехваткой веб-страницам оперативной памяти, найти причины и доработать компоненты.

Постепенно все "проблемные" компоненты будут найдены и исправлены и веб-решение будет использовать небольшой фиксированный объем оперативной памяти. Это позволит выделить другому программному обеспечению: веб-сервер, база данных, файловый кеш операционной системы - больше места.</li>
 </ol>